<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  
  
  
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  <title>
    Yaf---Session | 模板 | 模型  | Cli模式 |
    
    无敌小笼包</title>
  
    <link rel="shortcut icon" href="/favicon.png">
  
  <link rel="stylesheet" href="/css/style.css">
  
    <link rel="stylesheet" href="/fancybox/jquery.fancybox.min.css">
  
  <script src="/js/pace.min.js"></script>
</head>

<body>
<main class="content">
  <section class="outer">
  <article id="post-yaf03" class="article article-type-post" itemscope itemprop="blogPost">

  <div class="article-inner">
    
      <header class="article-header">
        
  
    <h1 class="article-title" itemprop="name">
      Yaf---Session | 模板 | 模型  | Cli模式
    </h1>
  

      </header>
    

    
      <div class="article-meta">
        <a href="/2016/07/30/yaf03/" class="article-date">
  <time datetime="2016-07-30T13:22:43.000Z" itemprop="datePublished">2016-07-30</time>
</a>
        
  <div class="article-category">
    <a class="article-category-link" href="/categories/Frame/">Frame</a>
  </div>

      </div>
    

    <div class="article-entry" itemprop="articleBody">
      
      
      
        <p>Yaf_Session是Yaf对Session的包装, 实现了Iterator, ArrayAccess, Countable接口, 方便使用.关于Yaf_Session的文档介绍：<a href="http://www.laruence.com/manual/yaf.class.session.html" target="_blank" rel="noopener">http://www.laruence.com/manual/yaf.class.session.html</a><br><a id="more"></a></p>
<h3 id="Session"><a href="#Session" class="headerlink" title="Session"></a>Session</h3><blockquote>
<p>使用示例   </p>
</blockquote>
<p><img src="/blog-img/yaf_1.bmp" alt="" title="phpinfo显示成功螃蟹图标再现"></p>
<h3 id="模板"><a href="#模板" class="headerlink" title="模板"></a>模板</h3><p>The Yaf_View_Simple class<br>官方文档：<a href="http://www.laruence.com/manual/yaf.class.view.html" target="_blank" rel="noopener">http://www.laruence.com/manual/yaf.class.view.html</a></p>
<p>Yaf_View_Simple是Yaf自带的视图引擎, 它追求性能, 所以并没有提供类似Smarty那样的多样功能, 和复杂的语法.<br>对于Yaf_View_Simple的视图模板, 就是普通的PHP脚本, 对于通过<code>Yaf_View_Interface::assgin</code>的模板变量,可在视图模板中直接通过变量名使用.</p>
<p>使用 <code>$this-&gt;getView()-&gt;assign()</code>在控制器中定义变量</p>
<pre><code>&lt;?php
class IndexController extends Yaf_Controller_Abstract {
  public function indexAction() {
    $mod = new UserModel();
    $list = $mod-&gt;where(&apos;id&apos;,1)-&gt;get();
    $this-&gt;getView()-&gt;assign(&quot;list&quot;, $list);
    $this-&gt;getView()-&gt;assign(&quot;title&quot;, &quot;Smarty Hello World&quot;);
    $this-&gt;getView()-&gt;assign(&quot;content&quot;, &quot;Hello World&quot;);
}
</code></pre><p>在模板文件中使用php脚本来输出</p>
<pre><code>&lt;html&gt;
  &lt;head&gt;
    &lt;meta charset=&quot;utf-8&quot;&gt;
    &lt;title&gt;&lt;?=$title;?&gt;&lt;/title&gt;
    &lt;/head&gt;
    &lt;body&gt;
         &lt;?=$content;?&gt;
    &lt;?php foreach($list as $val):?&gt;
        &lt;p&gt;&lt;?=$val[&apos;username&apos;]?&gt;&lt;/p&gt;
    &lt;?php endforeach;?&gt;
  &lt;/body&gt;
&lt;/html&gt;
</code></pre><h3 id="关闭自动加载模板"><a href="#关闭自动加载模板" class="headerlink" title="关闭自动加载模板"></a>关闭自动加载模板</h3><p>Yaf框架默认是开启自动加载模板的，如要关闭自动加载，可在<code>Bootstrap.php</code>里设置全局关闭，如：</p>
<pre><code>&lt;?php
class Bootstrap extends Yaf_Bootstrap_Abstract
  {
  public function _initConfig(){

    Yaf_Registry::set(&apos;config&apos;, Yaf_Application::app()-&gt;getConfig());
    Yaf_Dispatcher::getInstance()-&gt;autoRender(FALSE); // 关闭自动加载模板

  }
}
</code></pre><p>单独关闭模板加载，可以需要关闭的控制器内利用<code>Yaf_Dispatcher::getInstance()-&gt;disableView()</code>作：</p>
<pre><code>&lt;?php
class IndexController extends Yaf_Controller_Abstract {
    /**
    * Controller的init方法会被自动首先调用
    */
    public function init() {
    /**
    * 如果是Ajax请求, 则关闭HTML输出
    */
    if ($this-&gt;getRequest()-&gt;isXmlHttpRequest()) {
         Yaf_Dispatcher::getInstance()-&gt;disableView();
    }
  }
}
?&gt;
</code></pre><h3 id="手动调用指定模板"><a href="#手动调用指定模板" class="headerlink" title="手动调用指定模板"></a>手动调用指定模板</h3><p>在控制器里手动调用的方式有2种：</p>
<blockquote>
<p>一、调用当前<code>$this-&gt;_module</code>目录下的模版，下面是手动调用<code>view/index/</code>目录下<code>hello.phtml</code>模板</p>
</blockquote>
<pre><code>&lt;?php
    class IndexController extends Yaf_Controller_Abstract
    {
      public function indexAction()
      {
        $this-&gt;getView()-&gt;assign(&quot;content&quot;, &quot;Hello World&quot;);
        $this-&gt;display(&apos;hello&apos;);
      }
   }
</code></pre><blockquote>
<p>二、随意调用<code>view</code>目录下的模板，下面是调用<code>view/test/world.phtml</code>模板</p>
</blockquote>
<pre><code>&lt;?php
    class IndexController extends Yaf_Controller_Abstract
    {
        public function indexAction()
        {
            $this-&gt;getView()-&gt;assign(&quot;content&quot;, &quot;Hello World&quot;);
            $this-&gt;getView()-&gt;display(&apos;test/world.phtml&apos;);
        }
    }
</code></pre><h3 id="模型"><a href="#模型" class="headerlink" title="模型"></a>模型</h3><blockquote>
<p>还有不少同学问, 为什么Yaf没有ORM, 这里有俩方面的考虑:首先, <code>Yaf并不是万能的, 它只是解决了应用中, 最基本的一个问题, 就是框架带来的额外的性能开销,</code>然而这本部分的开销和你的应用实际的开销相比, 往往是很小的.但是, Yaf却代表着一种精神, 就是追求简单, 追求高效, 追求:”简单可依赖”, 所以Yaf专注于实现最核心的功能, 提供最稳定的实现.相比ORM, 如果要实现的很方便, 那必然会很复杂, 在当时的情况下, 实现ORM有可能会引入不稳定性第二, 也是最重要的一点是PHP已经提供了对DB的一个轻度封装的PDO, 我认为直接使用PDO, 会更加简单, 更加高效, 我不希望提供一个复杂的ORM包装, 鼓励大家去抛弃简单的PDO而使用ORM. 所以, 最初的时候, Yaf并不包含ORM.诚然, ORM可以提高开发效率, 尤其对于一些简单应用, 所以我想在后续的Yaf的版本中, 会考虑加入ORM, 但是那也绝对会是一个简单的ORM, 类似于Yaf的内建视图引擎: <code>Yaf_View_Simple</code>, 简单可依赖.</p>
</blockquote>
<p>显然，目前yaf是没有内置的操作数据库类了，那只能自己diy了，yaf的model规则是，类名以Model为后缀，放在放置在<code>models</code>文件夹下面</p>
<p>先在<code>application.ini</code>配置文件里添加数据库配置信息:</p>
<pre><code>db.type=mysql
db.host=localhost
db.database=test
db.username=root
db.password=123
db.charset = utf8
db.log = false
db.collation=utf8_unicode_ci
db.prefix =
</code></pre><p>在models文件夹下面新建一个base.php文件:</p>
<p><img src="/blog-img/yaff.bmp" alt="" title="phpinfo显示成功螃蟹图标再现"></p>
<p><img src="/blog-img/yaf_2.bmp" alt="" title="哟，还不错哦"></p>
<blockquote>
<p>载入第三方的ORM</p>
</blockquote>
<p>上面只是一个简单的model实现方法，大家可以再自行完善。在一些项目中，ORM可以提高开发效率,我这里也尝试着载入lavarel框架中所使用的Eloquent ORM。<br>loquent ORM操作介绍：<a href="http://www.golaravel.com/laravel/docs/4.2/eloquent/" target="_blank" rel="noopener">http://www.golaravel.com/laravel/docs/4.2/eloquent/</a><br>因为下载有点慢，我就直接从laravel5.1的包里面直接复制出的eloquent。</p>
<ul>
<li>将文件夹放置到library下面,如下所示</li>
</ul>
<p><img src="/blog-img/yaf_3.bmp" alt="" title="哟，还不错哦"></p>
<ul>
<li>在Bootstarpphp初始化eloquent</li>
</ul>
<pre><code>    &lt;?php
    Yaf_loader::import(&quot;/vendor/autoload.php&quot;);
    use Illuminate\Container\Container;
    use Illuminate\Database\Capsule\Manager as Capsule;
    class Bootstrap extends Yaf_Bootstrap_Abstract{
    private $config;
    public function _initConfig() {
    $this-&gt;config = Yaf_Application::app()-&gt;getConfig();
    Yaf_Registry::set(&quot;config&quot;, $this-&gt;config);
    }
   //载入数据库ORM
   public function _initDatabase()
   {
    $database = array(
      &apos;driver&apos; =&gt; $this-&gt;config-&gt;db-&gt;type,
      &apos;host&apos; =&gt; $this-&gt;config-&gt;db-&gt;host,
      &apos;database&apos; =&gt; $this-&gt;config-&gt;db-&gt;database,
      &apos;username&apos; =&gt; $this-&gt;config-&gt;db-&gt;username,
      &apos;password&apos; =&gt; $this-&gt;config-&gt;db-&gt;password,
      &apos;charset&apos; =&gt; $this-&gt;config-&gt;db-&gt;charset,
      &apos;collation&apos; =&gt; $this-&gt;config-&gt;db-&gt;collation,
      &apos;prefix&apos; =&gt; $this-&gt;config-&gt;db-&gt;prefix,
    );
    $capsule = new Capsule;
    // 创建链接
    $capsule-&gt;addConnection($database);
    // 设置全局静态可访问
    $capsule-&gt;setAsGlobal();
    // 启动Eloquent
    $capsule-&gt;bootEloquent();
}
</code></pre><ul>
<li>在models文件夹下新建UsersModel的Users.php:</li>
</ul>
<pre><code>&lt;?php
      use Illuminate\Database\Eloquent\Model as Mymodel;
      class UsersModel extends Mymodel{
            protected $table = &apos;user&apos;;
      }
      ?&gt;
      在控制器中调用：
      &lt;?php
      class IndexController extends Yaf_Controller_Abstract {
            public function indexAction() {
            Yaf_Dispatcher::getInstance()-&gt;disableView();
            $mod = new UsersModel();
            $data = $mod-&gt;find(1)-&gt;toArray();
            print_r($data);
      }
</code></pre><ul>
<li>更多关于Eloquent ORM的操作介绍可移步：</li>
</ul>
<p><a href="http://www.golaravel.com/laravel/docs/4.2/eloquent/" target="_blank" rel="noopener">http://www.golaravel.com/laravel/docs/4.2/eloquent/</a></p>
<h3 id="命令行模式"><a href="#命令行模式" class="headerlink" title="命令行模式"></a>命令行模式</h3><p>官方文档地址：<a href="http://yaf.laruence.com/manual/yaf.incli.times.html" target="_blank" rel="noopener">http://yaf.laruence.com/manual/yaf.incli.times.html</a></p>
<p>感觉文档写得有点简单，不好理解，这里聊下我是怎么用的yaf命令行。</p>
<blockquote>
<p>方法一</p>
</blockquote>
<p>在yaf中用到命令行大多是为了跑Crontab，首先，为了更好的与web区分(配置文件,argc、argv判断等等).重新创建个入口文件是比较好的做法</p>
<pre><code>&lt;?php

  define(&quot;APP_PATH&quot;, realpath(dirname(__FILE__)));

  $app = new Yaf_Application(APP_PATH . &quot;/conf/application.ini&quot;);

  $app-&gt;getDispatcher()-&gt;dispatch(new Yaf_Request_Simple());
</code></pre><p>然后再新建一个接收命令和操作的控制器Crontab.php:</p>
<pre><code>&lt;?php

class CrontabController extends Yaf_Controller_Abstract {

      public function init(){
      Yaf_Dispatcher::getInstance()-&gt;disableView();
      }
      public function indexAction($username = &apos;&apos;){
      //to do a crontab
      echo &apos;we get the name is : &apos;.$username;
      }

  }
?&gt;
</code></pre><p>接下来，我们在命令行中调用。在命令行中切换到你的项目目录，就是cli.php所在目录，然后输入如下命令：<br><code>php cli.php request_uri=&quot;/crontab/index&quot;</code>是不是在命令行看到了输出的字符串。<br><code>request_uri=&quot;/crontab/index&quot;</code> 中的路径便是Controller的路由路径.在例子里指向<code>/controllers/Crontab.php</code> 中的 <code>indexAction()</code></p>
<blockquote>
<p>方法二</p>
</blockquote>
<p>还有一种方法，通过<code>Yaf_Application::execute(..)</code>去实现。</p>
<p>先看一下这个函数的定义：</p>
<pre><code>public void Yaf_Application::execute ( callable $entry , string $... )
This method is typically used to run Yaf_Application in a crontab work. Make the crontab work
can also use the autoloader and Bootstrap mechanism.
</code></pre><p>第一参数需要定义一个回调函数,也可以是一个类中的某个函数。</p>
<p>示例：<code>$application-&gt;execute(“main”, $argc, $argv);</code>或</p>
<pre><code>$application-&gt;execute(array(“Class”,”Method”), $argc, $argv);
</code></pre><p>后面的参数为一个可变列表，值为你希望传入的参数。如些，我们将刚才新建的cli.php文件改写成：</p>
<pre><code>&lt;?php
define(&quot;APP_PATH&quot;, realpath(dirname(__FILE__)));
$app = new Yaf_Application(APP_PATH . &quot;/conf/application.ini&quot;);
$app-&gt;bootstrap()-&gt;execute(array(&apos;CrontabController&apos;,&apos;indexAction&apos;),&apos;wulei&apos;);
</code></pre><p>其中如果你需要用bootstrap的初始化的，可以保留，如果不需要的话，也可以把bootstrap去掉。</p>

      
    </div>
    <footer class="article-footer">
      <a data-url="http://blog.mango16.cc/2016/07/30/yaf03/" data-id="cjrbtw1z6002b6d8hd6zqtofz"
         class="article-share-link">分享</a>
      
  <ul class="article-tag-list"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/Yaf/">Yaf</a></li></ul>

    </footer>

  </div>

  
    
  <nav class="article-nav">
    
      <a href="/2016/07/31/yaf04/" class="article-nav-link">
        <strong class="article-nav-caption">前一篇</strong>
        <div class="article-nav-title">
          
            Yaf---异常和错误 | 路由和分发
          
        </div>
      </a>
    
    
      <a href="/2016/07/29/yaf02/" class="article-nav-link">
        <strong class="article-nav-caption">后一篇</strong>
        <div class="article-nav-title">Yaf---加载规则插件使用</div>
      </a>
    
  </nav>


  

  
    
  <div class="gitalk" id="gitalk-container"></div>
  <link rel="stylesheet" href="https://unpkg.com/gitalk/dist/gitalk.css">
  <script src="https://unpkg.com/gitalk/dist/gitalk.min.js"></script>
  <script src="https://cdn.bootcss.com/blueimp-md5/2.10.0/js/md5.min.js"></script>
  <script type="text/javascript">
      var gitalk = new Gitalk({
        clientID: 'caba8826a61790936307',
        clientSecret: '09a15037dcab30d9adf35a53ec6961939169f797',
        repo: 'm9rco.github.io',
        owner: 'm9rco',
        admin: ['m9rco'],
        // id: location.pathname,      // Ensure uniqueness and length less than 50
        id: md5(location.pathname),
        distractionFreeMode: false  // Facebook-like distraction free mode
      })

  gitalk.render('gitalk-container')
  </script>

  

</article>



</section>
  <footer class="footer">
  
  <div class="outer">
    <ul class="list-inline">
      <li>&copy; 2019 无敌小笼包</li>
      <i class="pulse"></i>
    </ul>
  </div>
</footer>

</main>
<aside class="sidebar">
  <button class="navbar-toggle"></button>

<nav class="navbar">
  
    <div class="logo">
      <a href="/"><img src="/images/hexo.svg" alt="无敌小笼包"></a>
    </div>
  
  <ul class="nav nav-main">
    
      <li class="nav-item">
        <a class="nav-item-link" href="/">主页</a>
      </li>
    
      <li class="nav-item">
        <a class="nav-item-link" href="/archives">归档</a>
      </li>
    
      <li class="nav-item">
        <a class="nav-item-link" href="/gallery">相册</a>
      </li>
    
      <li class="nav-item">
        <a class="nav-item-link" href="/nagging">叽咕</a>
      </li>
    
      <li class="nav-item">
        <a class="nav-item-link" href="/about">关于</a>
      </li>
    
    <li class="nav-item">
      <a class="nav-item-link nav-item-search" title="Search">
        <i class="fe fe-search"></i>
        搜索
      </a>
    </li>
  </ul>
</nav>

<nav class="navbar navbar-bottom">
  <ul class="nav">
    <li class="nav-item">
      
        <a class="nav-item-link" target="_blank" href="/atom.xml" title="RSS Feed">
          <i class="fe fe-feed"></i>
        </a>
      
    </li>
  </ul>
</nav>

<div class="search-form-wrap">
  <div class="local-search local-search-plugin">
  <input type="search" id="local-search-input" class="local-search-input" placeholder="Search...">
  <div id="local-search-result" class="local-search-result"></div>
</div>
</div>
</aside>
  <script src="/js/jquery-2.0.3.min.js"></script>
<script src="/js/lazyload.min.js"></script>


  <script src="/fancybox/jquery.fancybox.min.js"></script>



  <script src="/js/search.js"></script>


<script src="/js/ocean.js"></script>

</body>
</html>